// main.cpp - HarmonyOS版本
// ⚠️ 注意：HarmonyOS 上必须使用 qtmain() 而不是 main()！
// Qt 应用作为共享库加载，生命周期由 HarmonyOS 管理

#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QSurfaceFormat>
#include <QtQml>
#include <QDebug>
#include <QGuiApplication>
#include <QCoreApplication>
#include <QOpenGLContext>
#include <QQuickWindow>
#include <QQuickItem>
#include <QTimer>
#include <QVariant>

// 全局对象实例（静态变量，确保生命周期）
static QQmlApplicationEngine *g_engine = nullptr;

extern "C" int qtmain(int argc, char **argv)
{
    // 防止重复初始化
    if (g_engine != nullptr) {
        qDebug() << "Bezel_less_Widget Qt引擎已初始化，跳过重复初始化";
        return 0;
    }
    
    qDebug() << "Bezel_less_Widget 开始初始化Qt应用...";
    
    // ========================================
    // Step 0: 创建 Qt 应用实例（必须先于 QJSEngine/QQmlEngine）
    // ========================================
    // 在创建应用前设置使用 OpenGL ES，并共享上下文（部分设备/模拟器需要）
    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
    QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
    
    qputenv("QSG_INFO", "1");  // 保留调试信息

    QGuiApplication app(argc, argv);
    QCoreApplication::setApplicationName(QStringLiteral("Bezel_less_Widget"));
    QCoreApplication::setOrganizationName(QStringLiteral("Bezel_less_Widget"));
    QCoreApplication::setOrganizationDomain(QStringLiteral("bezel_less_widget.com"));
    
    // ========================================
    // Step 1: 配置 OpenGL ES 表面格式
    // ========================================
    QSurfaceFormat format;
    
    // 设置 Alpha 通道（透明度）
    format.setAlphaBufferSize(8);      // 8 位 Alpha 通道
    
    // 设置颜色通道（RGBA 32 位真彩色）
    format.setRedBufferSize(8);        // 8 位红色通道
    format.setGreenBufferSize(8);       // 8 位绿色通道
    format.setBlueBufferSize(8);        // 8 位蓝色通道
    
    // 设置深度和模板缓冲区
    format.setDepthBufferSize(24);     // 24 位深度缓冲
    format.setStencilBufferSize(8);    // 8 位模板缓冲
    
    // 指定渲染类型为 OpenGL ES
    format.setRenderableType(QSurfaceFormat::OpenGLES);
    
    // 模拟器上更稳定：强制使用 OpenGL ES 2.0
    format.setVersion(2, 0);
    format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
    format.setSamples(0);
    
    // 应用配置作为全局默认格式
    QSurfaceFormat::setDefaultFormat(format);
    qDebug() << "Bezel_less_Widget Using OpenGLES version:" << format.majorVersion() << "." << format.minorVersion();
    
    // ========================================
    // Step 2: 创建并配置 QML 引擎
    // ========================================
    g_engine = new QQmlApplicationEngine();
    
    // 添加组件搜索路径（确保能找到 components 目录下的组件）
    g_engine->addImportPath(QStringLiteral("qrc:/"));
    g_engine->addImportPath(QStringLiteral("qrc:/qml"));
    
    // 加载 QML 文件
    qDebug() << "Bezel_less_Widget 加载QML文件: qrc:/main.qml";
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(g_engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl) {
            QCoreApplication::exit(-1);
        } else if (obj && url == objUrl) {
            // ApplicationWindow 创建后，查找其内部的窗口对象
            qDebug() << "Bezel_less_Widget 根对象类型:" << obj->metaObject()->className();
            
            // 尝试通过属性访问窗口
            QVariant windowVariant = obj->property("window");
            if (windowVariant.isValid()) {
                QQuickWindow *window = qvariant_cast<QQuickWindow*>(windowVariant);
                if (window) {
                    qDebug() << "Bezel_less_Widget 通过window属性找到窗口，设置无边框标志";
                    window->setFlags(Qt::Window | Qt::FramelessWindowHint);
                }
            }
            
            // 也尝试直接转换（ApplicationWindow 可能在某些版本中直接是 Window）
            QQuickWindow *window = qobject_cast<QQuickWindow*>(obj);
            if (window) {
                qDebug() << "Bezel_less_Widget 直接转换为QQuickWindow，设置无边框标志";
                window->setFlags(Qt::Window | Qt::FramelessWindowHint);
            }
        }
    }, Qt::QueuedConnection);
    g_engine->load(url);
    
    // 延迟设置窗口标志（确保窗口已完全创建）
    QTimer::singleShot(200, [&app]() {
        if (!g_engine) return;
        
        QList<QObject*> rootObjects = g_engine->rootObjects();
        qDebug() << "Bezel_less_Widget 延迟检查，根对象数量:" << rootObjects.size();
        
        for (QObject* obj : rootObjects) {
            qDebug() << "Bezel_less_Widget 延迟检查根对象类型:" << obj->metaObject()->className();
            
            // 方法1: 尝试通过 window 属性访问（ApplicationWindow 有 window 属性）
            QVariant windowVariant = obj->property("window");
            if (windowVariant.isValid()) {
                QQuickWindow *window = qvariant_cast<QQuickWindow*>(windowVariant);
                if (window) {
                    qDebug() << "Bezel_less_Widget 通过window属性找到窗口，设置无边框标志";
                    window->setFlags(Qt::Window | Qt::FramelessWindowHint);
                    qDebug() << "Bezel_less_Widget 窗口标志已设置为:" << window->flags();
                    break;
                }
            }
            
            // 方法2: 直接转换（某些情况下 ApplicationWindow 可能直接是 Window）
            QQuickWindow *window = qobject_cast<QQuickWindow*>(obj);
            if (window) {
                qDebug() << "Bezel_less_Widget 直接转换为QQuickWindow，设置无边框标志";
                window->setFlags(Qt::Window | Qt::FramelessWindowHint);
                qDebug() << "Bezel_less_Widget 窗口标志已设置为:" << window->flags();
                break;
            }
            
            // 方法3: 通过 contentItem 查找窗口
            QQuickItem *item = qobject_cast<QQuickItem*>(obj);
            if (item && item->window()) {
                QQuickWindow *window = item->window();
                qDebug() << "Bezel_less_Widget 通过contentItem找到窗口，设置无边框标志";
                window->setFlags(Qt::Window | Qt::FramelessWindowHint);
                qDebug() << "Bezel_less_Widget 窗口标志已设置为:" << window->flags();
                break;
            }
        }
    });
    
    // 最稳妥兜底：若加载失败，展示内置应急界面，避免纯白屏
    if (g_engine->rootObjects().isEmpty()) {
        qWarning() << "Bezel_less_Widget QQmlApplicationEngine failed to load component. Fallback UI will be shown.";
        static const char fallbackQml[] =
            "import QtQuick 2.15\n"
            "Rectangle {\n"
            "  anchors.fill: parent\n"
            "  color: \"#FF0000\"\n"
            "  Text { anchors.centerIn: parent; color: \"white\"; text: \"QML加载失败\"; font.pixelSize: 20 }\n"
            "}\n";
        g_engine->loadData(QByteArray(fallbackQml), QUrl(QStringLiteral("qrc:/fallback.qml")));
        if (g_engine->rootObjects().isEmpty()) {
            qCritical() << "Bezel_less_Widget Fallback UI also failed to load. Exiting.";
        return -1;
        }
    } else {
        qDebug() << "Bezel_less_Widget QML文件加载成功";
    }

    // 进入事件循环
    return app.exec();
}

// 提供一个前向到 qtmain() 的适配，以兼容不同加载策略
extern "C" int main(int argc, char **argv)
{
    return qtmain(argc, argv);
}